package com.racetime.util;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.*;

/**
 * @author : Ice'Clean
 * @date : 2021-05-14
 *
 * 日志管理类
 */
public class MyLogger {
    private static HashMap<String, FileHandler> fileHandlerMap;

    private static final String LOG_PATH = "/home/tomcat/webapps/racetime/log/";

    static {
        // 初始化日志输出文件
        fileHandlerMap = new HashMap<>();

        // 确保日志文件存在
        folderBuild();
    }

    /**
     * 工具类私有化
     */
    private MyLogger() {

    }

    /**
     * 获取一个日志，如果日志不存在则新建一个日志
     * @param logName 日志的名称
     * @return 日志对象
     */
    public static Logger getLogger(String logName) {
        // 获取一个日志
        Logger logger = Logger.getLogger(LOG_PATH + logName);

        // 判断是否有该日志对应的输出文件
        boolean isExist = false;
        for (String name : fileHandlerMap.keySet()) {
            // 如果找到的话，直接绑定给该日志
            if (name.equals(logName)) {
                logger.addHandler(fileHandlerMap.get(name));
                isExist = true;
            }
        }

        // 如果不存在对应的输出的话，新建一个
        if (!isExist) {
            fileHandlerMap.put(logName, newFileHandler(logName));
            logger.addHandler(fileHandlerMap.get(logName));
        }

        // 返回可用的日志
        return logger;
    }

    /**
     * 获取新的日志输出文件
     * @param logName 日志文件的名称
     * @return 对应的日志文件输出通道
     */
    private static FileHandler newFileHandler(String logName) {
        FileHandler fileHandler;

        try {
            fileHandler = new FileHandler( LOG_PATH + logName, true);
            fileHandler.setFormatter(new Formatter() {
                @Override
                public String format(LogRecord record) {
                    return " [" + DateUtil.getTime() + "]  " + record.getSourceClassName() + " / " + record.getSourceMethodName() +
                            "\n [" + record.getLevel() + "]  " + record.getMessage() + "\n\n";
                }
            });

            return fileHandler;
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 判断日志文件夹是否存在
     * 若不存在则新建一个
     */
    private static void folderBuild() {
        // 获取存放日志的文件夹路径，并判断该文件夹是否存在，不存在则新建一个
        File headFile = new File(LOG_PATH);

        // 如果文件夹不存在并且创建文件夹失败，记录下错误，返回
        if (!headFile.exists() && !headFile.mkdir()) {
            System.out.println("日志文件夹不存在且创建失败！");
        }
    }
}
